package cn.iocoder.yudao.module.api.shop.info;

import cn.iocoder.yudao.framework.business.basic.pojo.vo.ShopSimpleVO;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.Assertions;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.validation.Percent;
import cn.iocoder.yudao.module.api.shop.info.dto.ShopInfoDTO;
import cn.iocoder.yudao.module.api.shop.info.enums.ShopStatusEnum;
import jakarta.annotation.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * 店铺信息的 API 接口
 *
 * @author 山野羡民（1032694760@qq.com）
 */
public interface ShopInfoApi {

    /**
     * 获取商家用户编号
     *
     * @param id 店铺编号
     * @return 用户编号
     */
    Long getOwnerMemberUserId(Long id);

    /**
     * 判断是否店铺所有者，即是否商家
     *
     * @param memberUserId 用户编号
     * @return true/false
     */
    boolean isOwnerByMemberUserId(Long memberUserId);

    /**
     * 获得店铺信息 Map
     *
     * @param ids 店铺编号的数组
     * @return 店铺信息 Map
     */
    default Map<Long, ShopInfoDTO> getShopInfoMap(Collection<Long> ids) {
        List<ShopInfoDTO> list = getShopInfoList(ids);
        return convertMap(list, ShopInfoDTO::getId);
    }

    /**
     * 获得店铺信息 Map
     *
     * @param ids 店铺编号的数组
     * @return 店铺信息 Map
     */
    default Map<Long, ShopSimpleVO> getShopSimpleMap(Collection<Long> ids) {
        List<ShopInfoDTO> list = getShopInfoList(ids);
        List<ShopSimpleVO> vos = BeanUtils.toBean(list, ShopSimpleVO.class);
        return convertMap(vos, ShopSimpleVO::getId);
    }

    /**
     * 获得店铺信息列表
     *
     * @param ids 店铺编号的数组
     * @return 店铺信息列表
     */
    List<ShopInfoDTO> getShopInfoList(Collection<Long> ids);

    /**
     * 获得店铺信息
     *
     * @param id 店铺编号
     * @return 店铺信息
     */
    @Nullable
    ShopInfoDTO getShopInfo(Long id);

    /**
     * 获得店铺信息
     *
     * @param id 店铺编号
     * @return 店铺信息
     */
    @Nullable
    default ShopSimpleVO getShopInfoSimple(Long id) {
        return BeanUtils.toBean(getShopInfo(id), ShopSimpleVO.class);
    }

    /**
     * 店铺有效：店铺存在、未禁用、营业中
     *
     * @param id 店铺编号
     */
    default ShopInfoDTO validShopInfo(Long id) {
        ShopInfoDTO shopInfo = getShopInfo(id);
        Assertions.notNull(shopInfo, "店铺不存在");
        Assertions.isTrue(CommonStatusEnum.isEnable(shopInfo.getEnabled()), "店铺【" + shopInfo.getName() + "】已被封禁");
        Assertions.equals(shopInfo.getStatus(), ShopStatusEnum.OPENING.getValue(), "店铺【" + shopInfo.getName() + "】未正常营业");
        return shopInfo;
    }

    /**
     * 按封禁获取店铺
     */
    Set<Long> getShopIdsByDisabled();

    /**
     * 按生活商圈获取店铺
     */
    Set<Long> getShopIdsByO2O();

    /**
     * 按行业类目获取店铺
     */
    Set<Long> getShopIdsByCategoryCode(String categoryCode);

    /**
     * 按行业类目获取店铺
     */
    Set<Long> getShopIdsByCategoryId(Long categoryId);

    /**
     * 按行政区域获取店铺
     */
    Set<Long> getShopIdsByCountyCodes(Set<String> countyCodes);

    /**
     * 按行政区域获取店铺
     */
    Set<Long> getShopIdsByCityCodes(Set<String> cityCodes);

    /**
     * 删除用户店铺，用户注销时用
     */
    void deleteShopInfoByMemberUserId(Long memberUserId);

    /**
     * 更新综合评分，当交易订单产品评价时触发
     *
     * @param id 店铺编号
     */
    void updateScoreWhenEvaluation(Long id);

    /**
     * 获取店铺信息
     *
     * @param memberUserId 用户编号
     */
    ShopInfoDTO getShopInfoByMemberUserId(Long memberUserId);

    /**
     * 获取店铺编号
     *
     * @param adminUserId 用户编号
     */
    Long getShopIdByAdminUserId(Long adminUserId);

    /**
     * 获取店铺编号
     *
     * @param memberUserId 用户编号
     */
    Long getShopIdByMemberUserId(Long memberUserId);

    /**
     * 获取店铺服务费比例
     *
     * @param id 店铺编号
     */
    @Percent
    double getServiceFeePercent(Long id);

}
